在鯊魚先前的認知中常用的物件有三個,分別是Object Function跟Array三種,這三個應該就是物件的基礎了,但是應該僅是個人的推測,我們要秉持著有多少資訊說多少話語,於是我去看看ECMA的分類,剛剛說的三個在ECMA中被分為兩類,分別是屬於Fundamental Objects(基礎物件)的Object跟Function,以及屬於Indexed Collections(索引集合)的Array。
Fundamental Objects(基礎物件),顧名思義Fundamental就是基礎,鯊魚秉持著學習一定要將基礎打好的精神,讓我們從基礎開始深入了解物件吧。
先前有簡略的帶過一次,物件的本質是將輸入的key轉換成一個value。
在Global Object中有一個"Object" property,這個就是物件的原型建構式,創立一個新物件的時候都會繼承這個constructor(建構式),而正因為有constructor(建構式),創立新物件的可以透過new去執行。
let shark = new Object();
shark
// {} 創立一個新的空物件
Property Descriptor(屬性描述器)用於解釋物件的操作和具體化。
像是值的異動與刪除。
屬性描述器有下面六種
Object的Properties有一部份跟Property Descriptor有關係,這邊先概略說一下。
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 }; // key b跟target的 b重複了
const source2 = { b: 6, d: 6 }; // key b 跟前面兩個重複了
console.log(Object.assign(target, source, source2));
// Object { a: 1, b: 6, c: 5, d: 6 }
// 以最後的source2 為主
Object.create ( O, Properties )
O表示一個物件
新創立的物件並可以可以調用O裡面所有的Properties。
也就是以O為原型,創建一個物件
Object.defineProperties ( O, Properties )
對物件O的一個Property Descriptor(屬性描述器)做修改。
Object.defineProperty ( O, P, Attributes )
對物件O的多個Property Descriptor(屬性描述器)做修改。
Object.entries ( O )
將物件的各組key跟value化成一個個的Array
常跟for...in一起用,將其逐一取出
Object.freeze ( O )
將物件O凍結,使其不能做任何修改
Object.fromEntries ( iterable )
是entries的反向操作,將一組組的[key,value]轉成一個物件。
Object.getOwnPropertyDescriptor ( O, P )
創建一個新物件,並將O的一個Property Descriptor(屬性描述器)變成自己的設定。
Object.getOwnPropertyDescriptors ( O )
創建一個新物件,並將O的全部的Property Descriptor(屬性描述器)變成自己的設定。
Object.getOwnPropertyNames ( O )
將物件O所有的key化作陣列輸出。
Object.getOwnPropertySymbols ( O )
跟getOwnPropertyNames類似,但是key的type必須是Symbol。
Object.getPrototypeOf ( O )
回傳物件O的原型物件。
Object.hasOwn ( O, P )
檢驗物件O的屬性P是不是自己的還是繼承而來的,並用Boolean回傳結果,如果是自己的則回傳true,不是則回傳false
Object.is ( value1, value2 )
檢驗value1跟value2是否相同,並用Boolean回傳結果
Object.isExtensible ( O )
檢驗物件O是否可以添加新的屬性,並用Boolean回傳結果
Object.isFrozen ( O )
檢驗物件O是被凍結,即是物件O有沒有運行過Object.isFrozen( O )
Object.isSealed ( O )
檢驗物件O的屬性能不能被刪除,並用Boolean回傳結果
Object.keys ( O )
感覺跟getOwnPropertyNames很類似,
將物件O所有Properties的key化作陣列輸出
Object.preventExtensions ( O )
禁止物件O添加新的屬性,
當運用Object.preventExtensions ( O )之後
用Object.isExtensible ( O )檢驗回=會回傳false
Object.prototype
後續會說到的物件Object.prototype的初始對象,
其內容為:
[[Writable]]: false,
[[Enumerable]]: false,
[[Configurable]]: false
Object.seal ( O )
使物件O的所有屬性不會被刪除,但是還是可以被修改。
Object.setPrototypeOf ( O, proto )
改變物件O的原型對象,將proto最為物件O的新原型。
但是極度不推薦使用。
Object.values ( O )
將物件O的value化作陣列輸出。
物件除了繼承constructor的properties之外,沒有特別的property。
物件少說一個Property Descriptor(屬性描述器)感覺就甚麼都不通順,總覺得卡卡的,後來才把這個補起來Property Descriptor(屬性描述器),雖然是急就章,但是可以多少多了解物件一點。
參考資料
EMCA262
MDN-Enumerability and ownership of properties
重新認識 JavaScript 深入理解 JavaScript 物件屬性
从深入到通俗:Object.prototype.toString.call()